Predavani binarnich dat pres COM/DCOM

Otázka od: Karel Kimes

4. 11. 2002 19:04

ahoj,
chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji   ).

Videl bych to asi takhle:
1) klient - vytvorit objekt implementujici napr. IStream
2) klient - naplnit IStream
3) klient - poslat IStream jako parametr v nejake metode, napr.
SetData(Stream) do COM objektu. ( procedure SetData(Stream : IStream); )
4) COM objekt - v COM objektu pracovat s daty (ulozit do DB, atd.)
(implementace SetData obdrzi v promene Stream ukazatel na IStream, je to tak?)

Co vy na to? (trocha kodu by taky neskodila)


dik

kchodl

Odpovedá: Jan Sebelík

5. 11. 2002 9:29

> Odesílatel: Karel Kimes <kkonf@email.cz>
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji   ).

Ja to delam pres typ OLEVariant.
A:=VarArrayCreate(..., varByte)
pak tam na nejakej pointer (pretypovani pres TVarData, myslim) udelam "move"
dat a je to.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Richard Kejval

5. 11. 2002 8:54

Ahoj,

ja posilam binarni data na DCOM server pres OleVariant.

napr : file

klient:
procedure TClient.DataSQLToServer;
var TempStream:TMemoryStream;
    Buffer:PChar; P:Pointer; L:Integer; V:OleVariant;
begin
    TempStream:=TMemoryStream.Create;
    try
      TempStream.LoadFromFile(NejakyFile);
       L:=TempStream.Size;
       GetMem(Buffer,L);
       TempStream.ReadBuffer(Buffer^,L);
    finally
      TempStream.Free;
    end;
    V:=VarArrayCreate([0,L-1], varByte);
    P:=VarArrayLock(V);
    try
      Move(Buffer^,P^,L);
    finally
      VarArrayUnLock(V);
    end;
    Server.DataSQL:=V;
  end;
end;

Server:
 IServer = interface(IDispatch)
    ['{ED442BBB-873E-42B5-B396-746216DB23CA}']
    function Get_DataSQL: OleVariant; safecall;
    procedure Set_DataSQL(Value: OleVariant); safecall;
    property DataSQL: OleVariant read Get_DataSQL write Set_DataSQL;
    ....
end;

procedure TServer.Set_DataSQL(Value: OleVariant);
var P:Pointer; L:integer; Buffer:PChar;
    TempStream:TMemoryStream;
begin
  L:=VarArrayHighBound(Value,1)-VarArrayLowBound(Value,1)+1;
  GetMem(Buffer,L);
  P:=VarArrayLock(Value);
  try
    Move(P^,Buffer^,L);
  finally
    VarArrayUnLock(Value);
  end;
  TempStream:=TMemoryStream.Create;
  try
    TempStream.WriteBuffer(Buffer^,L);
  finally
    TempStream.Free;
  end;
end;

Je to jen takovy nastin, takze doufam, ze je to z toho pochopitelne.
Pro ziskani dat ze serveru obdobne.

S pozdravem
ing. Richard Kejval
IC Software s.r.o

> ahoj,
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji   ).
>
> Videl bych to asi takhle:
> 1) klient - vytvorit objekt implementujici napr. IStream
> 2) klient - naplnit IStream
> 3) klient - poslat IStream jako parametr v nejake metode, napr.
> SetData(Stream) do COM objektu. ( procedure SetData(Stream : IStream); )
> 4) COM objekt - v COM objektu pracovat s daty (ulozit do DB, atd.)
> (implementace SetData obdrzi v promene Stream ukazatel na IStream, je to
tak?)
>
> Co vy na to? (trocha kodu by taky neskodila)
>
>
> dik
>
> kchodl
>
>
>

Odpovedá: Martin Schayna

5. 11. 2002 11:55

----- Original Message -----
From: "Karel Kimes" <kkonf@email.cz>
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji   ).

Predavej do metod promennou typu Variant - pole bytu.
To je jediny OLEAutomation kompatibilni typ kterym lze posilat
binarni data s malym overheadem. Prenasi se pak pouze tolik
bytu jako je bytu v poli + 16 bytu navic. Kazdy jine pole ve
Variantu ma o hodne vetsi "spotrebu".

Viz VarArrayCreate pro vytvoreni, VarArrayLock a
VarArrayUnlock pro naplneni z pameti.

Martin Schayna